package com.tanhua.dubbo.api.mongo;

import com.tanhua.domain.mongo.Comment;
import com.tanhua.domain.mongo.Publish;
import com.tanhua.domain.mongo.RecommendUser;
import com.tanhua.domain.vo.PageResult;
import org.apache.dubbo.config.annotation.Service;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import java.util.List;

/**
 * 圈子服务实现类
 *      点赞
 *      喜欢
 *      评论
 */
@Service
public class CommentApiImpl implements CommentApi{

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 点赞、喜欢、评论（针对-动态、视频、评论）
     * @param comment
     * @return
     */
    @Override
    public int saveComment(Comment comment) {
        //a.动态点赞记录保存到评论表
        comment.setId(ObjectId.get());//主键id
        comment.setCreated(System.currentTimeMillis());//动态点赞时间
        mongoTemplate.save(comment);
        //b.动态发布表中的点赞数量+1 根据发布id更新动态发布表 点赞数量+1
        updateCount(comment,1);
        //c.查询动态发布表中点赞数返回
        int count = getCount(comment);
        return count;
    }



    /**
     * 取消点赞 、 取消喜欢、 删除评论（针对-动态、视频、评论）
     * @param comment
     * @return
     */
    @Override
    public int removeComment(Comment comment) {
        //a.动态点赞记录从评论表中删除
        Query query = new Query();
        query.addCriteria(
                Criteria.where("publishId").is(comment.getPublishId())
                        .and("commentType").is(comment.getCommentType())
                        .and("pubType").is(comment.getPubType())
                        .and("userId").is(comment.getUserId())
        );
        mongoTemplate.remove(query,Comment.class);
        //b.动态发布表中的点赞数量-1
        updateCount(comment,-1);
        //c.查询动态发布表中点赞数返回
        int count = getCount(comment);
        return count;
    }

    /**
     * 根据动态id、评论类型=2、评论内容类型=1分页查询评论列表数据服务方法
     * @param page
     * @param pagesize
     * @return
     */
    @Override
    public PageResult<Comment> queryPageByPublishId(int page, int pagesize, String publishId) {
        //1.查询Comment表总记录数
        Query query = new Query();
        query.addCriteria(
                Criteria.where("publishId").is(new ObjectId(publishId))
                .and("commentType").is(2)
                .and("pubType").is(1)
        );
        query.with(Sort.by(Sort.Direction.DESC,"created"));
        //时间排序 最新的评论数据放到最上面
        query.limit(pagesize).skip((page - 1) * pagesize);
        long counts = mongoTemplate.count(query, Comment.class);
        //2.查询当前页面要展示的数据
        List<Comment> commentList = mongoTemplate.find(query, Comment.class);
        //3.将数据封装返回
        long pages = (counts / pagesize) + (counts%pagesize > 0 ? 1:0);
        return new PageResult<>(counts,(long)pagesize,pages,(long)page,commentList);
    }


    /**
     * 点赞列表 1  //评论类型，1-点赞，2-评论，3-喜欢
     */
    @Override
    public PageResult<Comment> messageCommentPage(int page, int pagesize, int commentType, Long publishUserId) {
        //1.查询Comment表总记录数
        Query query = new Query();
        query.addCriteria(
                Criteria.where("commentType").is(commentType)
                        .and("publishUserId").is(publishUserId)
        );
        query.with(Sort.by(Sort.Direction.DESC,"created"));
        //时间排序 最新的评论数据放到最上面
        query.limit(pagesize).skip((page - 1) * pagesize);
        long counts = mongoTemplate.count(query, Comment.class);
        //2.查询当前页面要展示的数据
        List<Comment> commentList = mongoTemplate.find(query, Comment.class);
        //3.将数据封装返回
        long pages = (counts / pagesize) + (counts%pagesize > 0 ? 1:0);
        return new PageResult<>(counts,(long)pagesize,pages,(long)page,commentList);
    }

    /**
     * 针对-动态操作
     * 根据动态发布id 更新点赞数量
     * 根据动态发布id 更新评论数量
     * 根据动态发布id 更新喜欢数量
     *
     * 针对-评论操作
     * 根据评论主键id 更新点赞数量
     *
     * @param comment
     * @param num
     */
    private void updateCount(Comment comment, int num) {
        if(comment.getPubType() == 3){
            Query query = new Query();
            //被评论主键id作为条件 更新点赞数
            query.addCriteria(Criteria.where("_id").is(comment.getPublishId()));
            Update update = new Update();//更新的数据
            update.inc("likeCount", num);//针对likeCount增加或减少1
            mongoTemplate.updateFirst(query, update, Comment.class);
        }
        if(comment.getPubType() == 1) {
            //Query query, Update update, Class<?> entityClass
            Query query = new Query();//更新条件
            query.addCriteria(Criteria.where("id").is(comment.getPublishId()));
            Update update = new Update();//更新的数据
            //comment.getCol() 替换 if else 判断更新哪个字段
            update.inc(comment.getCol(), num);//针对likeCount增加或减少1
            mongoTemplate.updateFirst(query, update, Publish.class);
        }
    }

    /**
     * 针对-动态
     * 根据发布id获取点赞数量
     * 根据发布id获取评论数量
     * 根据发布id获取喜欢数量
     *
     * 针对-评论
     * 根据评论id获取点赞数量
     * @param comment
     * @return
     */
    private int getCount(Comment comment) {
        //针对评论
        if(comment.getPubType() == 3){
            Comment cm = mongoTemplate.findById(comment.getPublishId(), Comment.class);
            return cm.getLikeCount();//点赞评论数量
        }
        //针对动态
        if(comment.getPubType() == 1) {
            Publish publish = mongoTemplate.findById(comment.getPublishId(), Publish.class);
            if (comment.getCommentType() == 1) {
                return publish.getLikeCount();
            }
            if (comment.getCommentType() == 2) {
                return publish.getCommentCount();
            }
            if (comment.getCommentType() == 3) {
                return publish.getLoveCount();
            }
        }
        return 0;
    }
}
